﻿/*+===================================================================
File:      FlyItem.cpp

Summary:   Định nghĩa các phương thức của CFlyItem.
===================================================================+*/

#include "FlyItem.h"
#include "Global.h"
#include "PlayState.h"
#include "BulletItem.h"
#include "Explosion.h"
#include <math.h>

using namespace std;

CFlyItem::CFlyItem(D3DXVECTOR2 pos, int id, int typeID, int bulletType)
	: CMoveableObject(pos, id, typeID, bulletType)
{
	m_v.x = 250.0f;
	m_v.y = 250.0f;
	m_pSprite = m_pResourceManager->GetSprite(ID_SPRITE_FLY_ITEM);
	// Chiều dài và rộng của box.
	m_box.width = 48;
	m_box.height = 30;
	m_nBulletType = bulletType;
}

CFlyItem::~CFlyItem()
{
}

void CFlyItem::Update(float timeFrame)
{
	if (!m_bIsLive)
		return;
	D3DXVECTOR2 posInViewPort = CViewport::GetInstance()->TransformMatrix(m_pos);
	if (posInViewPort.x < 0 || posInViewPort.x > SCREEN_WIDTH || posInViewPort.y < 0 || posInViewPort.y > SCREEN_HEIGHT)
	{
		m_bIsLive = false;
		return;
	}

	UpdateBox(timeFrame);
	
}

void CFlyItem::UpdateCollision(vector<CGameObject*> vecGameObjs, float timeFrame)
{

	if (!m_bIsLive)
		return;

	float timeCollision = timeFrame;
	CGameObject* objCollision = NULL; // Đối tượng va chạm sớm nhất.
	float normalx = 0.0f, normaly = 0.0f;

	// Xử lí va chạm với đạn của Bill
	for (int i = 0; i < CPlayState::s_billBullets.size(); i++)
	{
		if (CPlayState::s_billBullets[i]->IsLive())
		{
			float t = CheckCollision(CPlayState::s_billBullets[i], normalx, normaly, timeFrame);

			if (t < timeFrame && t < timeCollision)
			{
				// Tìm đối tượng và thời gian va chạm sớm nhất.
				timeCollision = t;
				objCollision = CPlayState::s_billBullets[i];
			}
		}
	}

	switch (g_nCurentLvl)
	{
	case ID_LEVEL1:
		m_pos.x += m_v.x * timeCollision;
		m_pos.y += m_v.y * sin((m_pos.x * PI) / 180) * timeCollision;
		break;
	case ID_LEVEL2:
		m_pos.x += m_v.x * sin((m_pos.y * PI) / 180) * timeCollision;
		m_pos.y += m_v.y * timeCollision;
		break;
	case ID_LEVEL3:
		m_pos.x += m_v.x * timeCollision;
		m_pos.y += m_v.y * sin((m_pos.x * PI) / 180) * timeCollision;
		break;
	}
	

	// Xử lí va chạm
	if (objCollision != NULL)
	{
		this->Kill();
		objCollision->Kill();
	}
}

bool CFlyItem::Kill()
{
	m_bIsLive = false;

	CBulletItem* bulletItem = new CBulletItem(m_pos, 0, m_nBulletType);
	CExplosion* explosion = new CExplosion(m_pos, 0, ID_SMALL_EXPLOSION);

	CPlayState::s_objsOutSideQuadTree.push_back(bulletItem);
	CPlayState::s_objsOutSideQuadTree.push_back(explosion);

	return true;
}
